package com.woniuxy.educationplatform.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.woniuxy.educationplatform.bean.AdminBean;
import com.woniuxy.educationplatform.bean.RoleBean;
import com.woniuxy.educationplatform.mapper.AdminMapper;
import com.woniuxy.educationplatform.service.IAdminService;
import com.woniuxy.educationplatform.util.Md5Util;
import com.woniuxy.educationplatform.util.PageDto;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author unreleased
 * @date 2020/12/10 11:13
 */
@Service
@Transactional(readOnly = true)
public class AdminServiceImpl implements IAdminService {
    @Resource
    private AdminMapper adminMapper;

    /**
     * 新增管理员
     * BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG BUG
     * 此方用于批量添加管理员 由于从excel中暂时无法将fk_role_id封装到Bean中  所以数据库的fk_role_id暂时默认为2
     *
     * @param adminBean 携带信息的adminBean
     * @return 是否成功;
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean addAdmin(AdminBean adminBean) {
        return adminMapper.addAdmin(adminBean)>0;
    }

    /**
     * 根据具体id查询管理员一些简单信息
     *
     * @param id 根据id查询管理员
     * @return 返回一个管理员对象
     */
    @Override
    public AdminBean findAdminById(Integer id) {
        return adminMapper.findAdminById(id);
    }

    /**
     * 管理员修改密码
     *
     * @param loginName   登录名
     * @param oldPassword 原密码
     * @param newPassword 新密码
     * @return 是否修改成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateAdminPassword(String loginName, String oldPassword, String newPassword) {
        //原密码转换为md5加密之后的密码
        String oldPwd = Md5Util.encryption(loginName, oldPassword);
        //新密码转换为md5加密之后的密码
        String newPwd = Md5Util.encryption(loginName, newPassword);
        return adminMapper.updateAdminPassword(loginName, oldPwd, newPwd) > 0;
    }

    /**
     * 判断修改是否成功
     *
     * @param adminBean 修改对象的数据
     * @return 修改是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateAdminByLoginName(AdminBean adminBean) {
        return adminMapper.updateAdminByLoginName(adminBean) > 0;
    }

    /**
     * 判断登录名是否重复
     *
     * @param loginName 登录名
     * @param id        id
     * @return 判断结果
     */
    @Override
    public boolean checkLoginNameIsRepeat(String loginName, Integer id) {
        AdminBean adminByLoginName = adminMapper.checkByLoginName(loginName);
        if (adminByLoginName == null) {
            return false;
        }else{
            AdminBean adminById = adminMapper.checkById(id);
            if (adminById != null) {
                //如果是同一个对象 则return false；不重复
                return !adminById.getId().equals(adminByLoginName.getId());
            }
        }
        return true;
    }

    /**
     * 新增管理员
     *
     * @param adminBean 携带信息的adminBean对象
     * @param roleId    角色信息
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean saveAdmin(AdminBean adminBean, Integer roleId) {
        adminBean.setRoleBean(new RoleBean().setId(roleId));

        //将密码加密存入数据库
        String md5Pwd = Md5Util.encryption(adminBean.getLoginName(),adminBean.getPassword());
        adminBean.setPassword(md5Pwd);
        return adminMapper.saveAdmin(adminBean)>0;
    }

    /**
     * 根据登录名来修改管理员信息
     * 用于超级管理员修改信息
     * 后期可用于修改管理员的登录名
     *
     * @param adminBean 修改的数据
     * @param roleId 修改角色
     * @return 数据库受影响条数 判断是否修改成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean updateAdminById(AdminBean adminBean,Integer roleId) {
        if (roleId != null) {
            adminBean.setRoleBean(new RoleBean().setId(roleId));
        }
        if("".equals(adminBean.getPassword())){
            adminBean.setPassword(null);
        }
        if (adminBean.getLoginName() != null && adminBean.getPassword() != null) {
            String md5Pwd = Md5Util.encryption(adminBean.getLoginName(), adminBean.getPassword());
            adminBean.setPassword(md5Pwd);
        }
        return adminMapper.updateAdminById(adminBean) > 0;
    }

    /**
     * 根据管理员ID删除对应的管理员
     *
     * @param id 前端对应id
     * @return 返回是否删除成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean delAdminById(Integer id) {
        //不允许删除超级管理员！！！
        if(id==1){
            System.out.println("有人试图删除超级管理员");
            return false;
        }
        return adminMapper.delAdminById(id) > 0;
    }

    /**
     * 根据条件分页查询 所有的管理员
     *
     * @param pageNum   当前页码数
     * @param pageSize  每页多少条
     * @param adminBean 携带了条件的adminBean
     * @return 分页对象 回传总条数以及分页后的数据
     */
    @Override
    public PageDto findAllByParams(AdminBean adminBean, int pageNum, int pageSize) {
        //页码非法则直接返回
        if (pageNum <= 0) {
            return null;
        }
        PageHelper.startPage(pageNum, pageSize);
        List<AdminBean> data = adminMapper.findAllByParams(adminBean);
        PageInfo<AdminBean> pageInfo = new PageInfo<>(data);

        PageDto pageDto = new PageDto();
        //返回一共多少条数据
        pageDto.setTotal(pageInfo.getTotal());
        //返会数据
        pageDto.setData(data);
        return pageDto;
    }

    /**
     * 根据登录名查询admin的信息
     *
     * @param loginName 登录名
     * @return adminBean对象
     */
    @Override
    public AdminBean findAdminByLoginName(String loginName) {
        return adminMapper.findAdminByLoginName(loginName);
    }
}
